/* 一种行为型设计模式，用于定义一个语言的文法，并解释该语言中的表达式。
它将每个文法规则表示为一个类，通过组合这些规则的对象来解释表达式。 */

/* 抽象表达式（Abstract Expression）：定义了一个抽象接口，声明了解释操作的方法。
终结符表达式（Terminal Expression）：实现了抽象表达式接口，表示语言中的终结符或基本表达式。
非终结符表达式（Non-terminal Expression）：实现了抽象表达式接口，表示语言中的非终结符或复杂表达式。通常由多个终结符和/或其他非终结符组成。
上下文（Context）：包含需要解释的语句或表达式。
解释器：调用终结符和非终结符处理上下文对象，并返回解释结果或者根据结果执行动作。 */

// 使用场景:
/* 解析和执行脚本语言：浏览器通过 JavaScript 解释器来解析和执行 JavaScript 代码。这个解释器可以被视为实现了解释器设计模式的一部分，它将 JavaScript 代码转换成可执行的指令。
正则表达式：在 JavaScript 中，正则表达式是一种强大的工具，它通常用于匹配、搜索和替换文本。正则表达式可以被看作是一种小型的解释器，它解释并执行特定的模式规则。
数据查询和处理语言：在浏览器开发中，我们经常使用像 XPath、CSS 选择器或 jQuery 等工具来查询和操作 DOM 元素。这些查询语言可以被视为解释器，它们解释和执行特定的查询语句，并返回符合条件的结果集。
模板引擎：模板引擎用于生成动态内容，例如在前端开发中根据数据渲染 HTML 模板。一些模板引擎（如 Handlebars、Mustache 等）可能使用解释器设计模式，将模板语法解释为可执行的代码块。
国际化和本地化：在多语言网站开发中，解释器设计模式可以用于处理本地化字符串和格式化，例如解析日期时间格式、数字格式等。这些解释器可以将特定的本地化规则应用于字符串和数据，以生成适合特定语言环境的文本。 */

// 下面是一个简单的解释器

// 上下文类
class Context {
    private _list : any[] = []
    private _sum : number = 0
    constructor() {}
  
    get sum() {
      return this._sum;
    }
    set sum(newValue) {
      this._sum = newValue;
    }
    add(expression) {
      this._list.push(expression);
    }
    get list() {
      return [...this._list];
    }
  }
  
  class PlusExpression {
    interpret(context) {
      if (!(context instanceof Context)) {
        throw new Error("TypeError");
      }
      context.sum = ++context.sum;
    }
  }

  class MinusExpression {
    interpret(context) {
      if (!(context instanceof Context)) {
        throw new Error("TypeError");
      }
      context.sum = --context.sum;
    }
  }
  
  /** 以下是测试代码 **/
  const context = new Context();
  
//   // 依次添加: 加法 | 加法 | 减法 表达式
  context.add(new PlusExpression());
  context.add(new PlusExpression());
  context.add(new MinusExpression());
  
// 依次执行: 加法 | 加法 | 减法 表达式
  context.list.forEach(expression => expression.interpret(context));
  console.log(context.sum);

 


